// (C) Copyright 2012 Kystar. All rights reserved.

`timescale 1ns/100ps
`default_nettype none

module net_output 
(
    input  wire          I_sclk,
    input  wire          I_rst_n,
    // frame & disp set pkg
    input  wire          I_ack_net_frame,
    input  wire          I_net_out_en_frame,
    input  wire [  7: 0] I_net_out_data_frame,
    // disp data pkg
    input  wire          I_ack_net_disp_data,
    input  wire          I_net_out_en_disp_data,
    input  wire [  7: 0] I_net_out_data_disp_data,
    // idle pkg
    input  wire          I_ack_net_idle,
    input  wire          I_net_out_en_idle,
    input  wire [  7: 0] I_net_out_data_idle,
    // comm pkg
    input  wire          I_ack_net_comm,
    input  wire          I_net_out_en_comm,
    input  wire [  7: 0] I_net_out_data_comm,
    // audio pkg
    input  wire          I_ack_net_audio,
    input  wire          I_net_out_en_audio,
    input  wire [  7: 0] I_net_out_data_audio,
    //
    input  wire          I_reg_mac_addr_incr_en,
    //
    output wire          O_rgmii_txc,
    output wire          O_rgmii_txen,
    output wire [  3: 0] O_rgmii_txd
);

/******************************************************************************
                                <localparams>
******************************************************************************/

/******************************************************************************
                              <internal signals>
******************************************************************************/
reg  net_in_en;
reg  [ 7: 0] net_in_data;
wire net_out_en;
wire [ 7: 0] net_out_data;
wire net_out_en_with_crc;
wire [ 7: 0] net_out_data_with_crc;

/******************************************************************************
                                <module body>
******************************************************************************/
always @(posedge I_sclk)
    if (I_ack_net_frame)
        begin
        net_in_en <= I_net_out_en_frame;
        net_in_data <= I_net_out_data_frame;
        end
    else if (I_ack_net_disp_data)
        begin
        net_in_en <= I_net_out_en_disp_data;
        net_in_data <= I_net_out_data_disp_data;
        end
    else if (I_ack_net_idle)
        begin
        net_in_en <= I_net_out_en_idle;
        net_in_data <= I_net_out_data_idle;
        end
    else if (I_ack_net_comm)
        begin
        net_in_en <= I_net_out_en_comm;
        net_in_data <= I_net_out_data_comm;
        end
    else if (I_ack_net_audio)
        begin
        net_in_en <= I_net_out_en_audio;
        net_in_data <= I_net_out_data_audio;
        end       
    else
        begin
        net_in_en <= 1'b0;
        net_in_data <= 8'd0;
        end

net_mac_addr u_net_mac_addr
(
    .I_sclk(I_sclk),
    .I_net_in_en(net_in_en),
    .I_net_in_data(net_in_data),
    .O_net_out_en(net_out_en),
    .O_net_out_data(net_out_data),
    .I_reg_mac_addr_incr_en(I_reg_mac_addr_incr_en)
);

crc_calculate u_crc_calculate
(
    .I_sclk(I_sclk),
    .I_rst_n(I_rst_n),
    .I_net_en(net_out_en),
    .I_net_data(net_out_data),
    .O_net_en(net_out_en_with_crc),
    .O_net_data(net_out_data_with_crc)
);

oddr_ctr u_oddr_ctr
(
    .I_sclk(I_sclk),
    .O_rgmii_px_txc(O_rgmii_txc),
    .O_rgmii_px_txen(O_rgmii_txen),
    .O_rgmii_px_txd(O_rgmii_txd),
    .I_px_txen(net_out_en_with_crc),
    .I_px_txd(net_out_data_with_crc)
);

endmodule
`default_nettype wire

